package cn.hou.socket01._03nio01;

import java.nio.IntBuffer;

import org.junit.Test;

//nio中Buffer的使用
public class BufferTest {

    @Test
    public void test01() {
        IntBuffer buf = IntBuffer.allocate(10);//创建指定长度的缓冲buffer
        //pos: 存储或者读取到的数据的当前位置，下一个数据将从该position处后面的一个字节开始存储
        //limit:缓冲区中数据的有效位置，默认和容量一样
        //cap:初始容量
        System.out.println(buf);//[pos=0 lim=10 cap=10]
        buf.put(1); //pos 加一   put(int)方法 pos会加一
        buf.put(2); //pos 加一
        buf.put(3); //pos 加一
        System.out.println(buf);//[pos=3 lim=10 cap=10]
        buf.flip();//复位,pos变为o,limit变为buffer中实际数量
        System.out.println(buf);//[pos=0 lim=3 cap=10]
        buf.put(1, 0); // 向某一个明确已有数据位置put数据,pos不变
        buf.get(2); //获取某个下标数据时,pso也不变
        //注意: put或get 某个下标时,必须小于limit-1(下标从0开始),否则会抛异常
        System.out.println(buf);//[pos=0 lim=3 cap=10]
        //循环获取时,需要用limit,不能用容量
        for (int i = 0; i < buf.limit(); i++) {
            //调用get方法会使其缓冲区位置（position）向后递增一位
            System.out.print(buf.get() + "\t");
        }
        System.out.println();
        System.out.println("buf对象遍历之后为: " + buf);//[pos=3 lim=3 cap=10]
    }

    @Test
    public void test02() {
        /**
         * wrap方法会包裹一个数组: 一般这种用法不会先初始化缓存对象的长度，因为没有意义，
         * 最后还会被wrap所包裹的数组覆盖掉。并且wrap方法修改缓冲区对象的时候，数组本身也会跟着发生变化。
         */
        IntBuffer buf = IntBuffer.allocate(10);
        int[] arr = new int[]{1, 2, 5};
        buf = IntBuffer.wrap(arr);
        System.out.println(buf);//[pos=0 lim=3 cap=3]
        //添加数组的前两个数进入buffer,容量还是原来数组的容量
        IntBuffer buf01 = IntBuffer.wrap(arr, 0, 2);
        System.out.println(buf01);//[pos=0 lim=2 cap=3]

        IntBuffer buf3 = buf.duplicate();//克隆一个buffer
        System.out.println(buf3);
        //buf.position(0);//设置buffer的pos.一般不建议使用这个,都使用后flap
        //最佳遍历方式
        buf.remaining();//获取目前可读数据长度,即limit长度
        int[] arr2 = new int[buf.remaining()];
        //将缓冲区数据放入arr2数组中去
        buf.get(arr2);
        for (int i : arr2) {
            System.out.print(Integer.toString(i) + "\t");//1 2 5
        }
    }

    @Test
    public void test03() {
    }

}
